package com.ganmiao.utils;

import cn.hutool.core.lang.Assert;
import com.alibaba.fastjson2.JSON;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Map;
import java.util.Objects;

@Slf4j
public class WordUtil {

    /**
     * @param templatePath   文档模板存放路径
     * @param createFileDir  生成的文档存档地址
     * @param createFileName 生成的文件名（不带格式后缀）
     * @param paramsMap      需要填充的内容
     * @return
     */
    public static String createWord(String templatePath, String createFileDir, String createFileName, Map<String, Object> paramsMap, Configure configure) throws IOException {
        log.info("【动态填充文档公共方法】被操作文档：{}，填充后新文档存放地址：{}，填充后新文档名称：{}，" +
                        "填充字段内容：{}", JSON.toJSONString(templatePath), JSON.toJSONString(createFileDir),
                JSON.toJSONString(createFileName), JSON.toJSONString(paramsMap));
        Assert.notNull(templatePath, "文档模板存放路径不能为空");
        Assert.notNull(createFileDir, "生成的文档存档地址不能为空");
        Assert.notNull(createFileName, "生成的文件名不能为空");
        Assert.notNull(paramsMap, "需要填充的内容不能为空");
        //生成的文件格式
        String formatSuffix = ".docx";
        //拼接后的文件名
        String fileName = createFileName + formatSuffix;
        log.info("生成合同的文件名（带后缀）为：{}", JSON.toJSONString(fileName));
        //生成文件存放路径
        if (!createFileDir.endsWith("/")) {
            createFileDir = createFileDir + File.separator;
        }
        File dir = new File(createFileDir);
        if (!dir.exists()) {
            boolean result = dir.mkdirs();
            log.info("生成合同时存储文件的路径={}不存在，已自动创建文件夹result={}", createFileDir,result);
        }
        //生成的文件全路径
        String filePath = createFileDir + fileName;
        log.info("生成文件的存放路径（绝对路径）：{}", JSON.toJSONString(filePath));
        XWPFTemplate template = null;
        if(Objects.nonNull(configure)){
            URL url = new URL(templatePath);
            InputStream in = url.openStream();
            template = XWPFTemplate.compile(in, configure).render(paramsMap);
        }else {
            template = XWPFTemplate.compile(templatePath).render(paramsMap);
        }

        try {
            // 将填充之后的模板写入filePath
            template.writeToFile(filePath);
            template.close();
        } catch (Exception e) {
            log.error("生成word异常", e);
            return "";
        }

        return filePath;
    }

}
